package controleur;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.Timer;

import modele.*;
import vue.*;

/**
 * Manipule les objets 'metier' : Trains, Led, Portes et Manette. 
 * Il n'y a ici aucune manipuation directe d'element visuel 
 * (hormis l'instanciation de la vue et le lancement de l'ecoute des objets metier par la/les vues).
 * La vue ecoute le modele et le modele notifie la vue quand il est modifie par le controleur.
 * @author Jo
 *
 */
public class Controleur implements ActionListener {
	
	/**
	 * Point d'entree du programme.
	 * @param args
	 */
	public static void main(String[] args) {
		Display vue = new Display();
		Controleur controleur = new Controleur(vue);
		vue.setControleur(controleur);
	}
	
	/**
	 * Duree differente selon les timers.
	 */
	public static final int[] DUREES_TRAINS={3000,2000,1000};
	public static final int[] DUREES_PORTES={(int) (3000*0.75),(int) (2000*0.75),(int) (1000*0.75)};
	
	
	/**
	 * Vue utilisee pour ecouter les objets metier.
	 */
	Display vue;

	/*
	 * Objets 'metier'.
	 */
	public Manette manette= new Manette();
	public TrainAterrissage[] train= new TrainAterrissage[3];
	public LED leds= new LED();
	public Portes[] portes = new Portes[3];

	public Timer[] timerTrain = new Timer[3];
	public Timer[] timerPortes = new Timer[3];
	
	
	/**
	 * Initialisation du controleur.
	 * @param vueParam Pour ecouter les modeles.
	 */
	public Controleur(Display vueParam) {
		this.vue = vueParam;
		
		for (int i = 0; i < 3; i++) {
			final int j=i;
			
			
			
			train[j] = new TrainAterrissage();
			portes[j] = new Portes();
			
			/*
			 * Timer du train
			 */
			timerTrain[j] = new Timer(DUREES_TRAINS[j], new ActionListener() {
	           public void actionPerformed(ActionEvent e) {
	        	   
	        	   //if(j==2) System.out.println(train[2].getEtat());
	        	   
	        	   //Si les train est en transition down
	        	   if(train[j].isDown()){
		        	   //Train plus en transition
	        		   train[j].finish();
	        	   }
	        	   
	        	   //Si le train est en position up
	        	   else if(train[j].isUp()){
	        		   //Train plus en transition
	        		   train[j].finish();
	        		   
	        		   //Si porte ouverte
	        		   if(portes[j].isOuvertes()){
	        			   //Transitionner les portes
	        			   portes[j].switcher();
	        			   timerPortes[j].stop();timerPortes[j].start();
	        		   }
	        		   
	        		   //else pb
	        	   }
	               mettreAJourLeds();
	               
	               timerTrain[j].stop();
		       }
			});
			
			/*
			 * Timer des portes
			 */
			timerPortes[j] = new Timer(DUREES_PORTES[j], new ActionListener() {
	           public void actionPerformed(ActionEvent e) {
	        	   
	        	   //Si porte en transition down
	        	   if(portes[j].isDown()){
	        		   //Porte plus en transition
	        		   portes[j].finish();
	        		   
	        		   //Si le train est ferme (retracte)
	        		   if(train[j].isFerme()){
	        			   //Transitionner le train (pour le sortir)
	        			   train[j].switcher();
	        			   timerTrain[j].stop();timerTrain[j].start();
	        		   }
	        	   }
	        	   //Si porte en transition up
	        	   else if(portes[j].isUp()){
	        		   //Porte plus en transition
	        		   portes[j].finish();
	        	   }
	        	   
	        	   mettreAJourLeds();
	        	   
	        	   timerPortes[j].stop();
		       }
			});
		}
				
		/*
		 * Initialisation de la vue.
		 */
		
		if(this.vue != null){
			
			//train.addVolumeListener(vue);
			train[0].addListener(this.vue.aterrissage);
			train[1].addListener(this.vue.aterrissage2);
			train[2].addListener(this.vue.aterrissage3);
			
			portes[0].addListener(this.vue.aterrissage);
			portes[1].addListener(this.vue.aterrissage2);
			portes[2].addListener(this.vue.aterrissage3);
			
			leds.addListener(this.vue);
			
			manette.addListener(this.vue);
		}
	}
	
	/**
	 * Bouton manette cliqued.
	 */
	public void boutonManetteActioned(){
		
		boolean arreterTout = false;
		for (int i = 0; i < 3; i++) {
			final int j=i;
			
			if(train[j].isEnTransition() || portes[j].isEnTransition()){
				arreterTout = true;
			}
			timerTrain[j].stop();
			timerPortes[j].stop();
		}
		//if(arreterTout) return;
		
		manette.switcher();
		
		//Pour chaque groupe train-portes
		for (int i = 0; i < 3; i++) {
			final int j=i;
			
			
			//Manette actionnee quand le train est en mouvement :
			if(arreterTout){
				if(portes[j].isDown()){
					//Transitionner les portes
     			   portes[j].switcher();
     			   timerPortes[j].stop();timerPortes[j].start();
				}
				else if(train[j].isDown()){
					train[j].switcher();
					timerTrain[j].stop();timerTrain[j].start();
				}
				else if(train[j].isUp()){
					//Transitionner le train (pour le sortir)
     			   train[j].switcher();
     			   timerTrain[j].stop();timerTrain[j].start();
				}
				else if(portes[j].isUp()){
					portes[j].switcher();
					timerPortes[j].stop();timerPortes[j].start();
				}
				
				//duplique
				else if(portes[j].isFermees() /*&& train[j].isFerme()*/){
					portes[j].switcher();
					timerPortes[j].stop();timerPortes[j].start();
				}
				else if(/*portes[j].isOuvertes() &&*/ train[j].isOuvert()){
					train[j].switcher();
					timerTrain[j].stop();timerTrain[j].start();
				}
				//
			}
			//Manette actionnee qd le systeme est au repos (si arreterTout == false)
			else{
				if(portes[j].isFermees() /*&& train[j].isFerme()*/){
					portes[j].switcher();
					timerPortes[j].stop();timerPortes[j].start();
				}
				else if(/*portes[j].isOuvertes() &&*/ train[j].isOuvert()){
					train[j].switcher();
					timerTrain[j].stop();timerTrain[j].start();
				}
			}
			
		}

		leds.setOrange();
	}
	
	
	/**
	 * Appeled quand un des timers a fini. Verifie si tous les trains sont OUVERT (&rarr; la led devient VERTE)  ou bien FERME (&rarr; la led devient ETEINTE).
	 */
	public void mettreAJourLeds(){
		if(train[0].getEtat()==train[1].getEtat() && train[1].getEtat()==train[2].getEtat()){
			
			if(train[0].isOuvert()){
				leds.setVerte();
			}
			/*else if(train[0].isFerme()){
				leds.setEteinte();
			}*/
		}
		if(portes[0].getEtat()==portes[1].getEtat() && portes[1].getEtat()==portes[2].getEtat()){
			if(portes[0].isFermees()){
				leds.setEteinte();
			}
		}
		if(train[0].isEnTransition() || train[1].isEnTransition() || train[2].isEnTransition()
				//|| portes[0].isEnTransition() || portes[1].isEnTransition() || portes[2].isEnTransition()
				){
			leds.setOrange();
		}
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		this.boutonManetteActioned();
	}
	
}
